﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using prjKQXS_DLL;
using prjKQXS_DLL.Dal;
using prjKQXS_DLL.Security;

namespace prjKQXS_UI.Security
{
    public partial class frmQuanTriNguoiDung : DevExpress.XtraEditors.XtraForm
    {
        clsUser cls = new clsUser();

        private bool isThem = false;

        /// <summary>
        /// Tự động được gán tại gvDSUser_RowClick
        /// </summary>
        int idUser = 1;

        int quyenlv;

        public frmQuanTriNguoiDung()
        {
            InitializeComponent();

            cls.OnAction += new clsUser.OnActionHandler(cls_OnAction);
            cls.OnError += new clsUser.OnErrorHandler(cls_OnError);
        }

        private void frmUser_Load(object sender, EventArgs e)
        {
            loaddata();
            //quyenlv = Config.getUR_Quyen(BienTc.username, "mnSys_NSD");
            //if (quyenlv > 1)
            //{
            //    sbtnSua.Enabled = false;
            //    sbtnThem.Enabled = false;
            //    sbtnXoa.Enabled = false;
            //    sbtnLuu.Enabled = false;

            //} 
            //else if (quyenlv > 0)
            //{
            //    sbtnSua.Enabled = false;
            //    sbtnXoa.Enabled = false;
            //}
        }

        private void frmUser_FormClosing(object sender, FormClosingEventArgs e)
        {
            int quyen = Config.getUR_Quyen(BienTc.username, "chkKhoiphuc");
            //if (quyen > 0) BienTc.chkKPhuc = false;
            //else
            //    BienTc.chkKPhuc = true;
            this.Hide();
            this.Dispose();
        }

        #region cls event --------------------------------------------
        private void cls_OnAction(SqlException e)
        {
            cls_OnError(e);
        }

        private void cls_OnError(Exception e)
        {
            clsCommon.MsgBox("Một lỗi chưa được xử lý đã xảy ra. Chi tiết lỗi: \n" + e.Message, 0);
            this.Close();
        }
        #endregion ---------------------------------------------------

        private void loaddata()
        {
            gcDSUser.DataSource = clsCommon.FillData("select *  from tblUser where isPublic = 1");
            if (gvDSUser.RowCount > 0) gvDSUser.FocusedRowHandle = 0;
            gvDSUser.Focus();
            gvDSUser_RowClick(gvDSUser, null);
        }

        private bool validateForm()
        {
            if (teFullName.Text.Trim().Length == 0)
            {
                clsCommon.MsgBox("Họ và tên không được để trống, vui lòng nhập lại!", 5);
                xtabAccount.SelectedTabPage = xtpUserInfo;
                teFullName.Focus();
                return false;
            }

            if (teUserName.Text.Trim().Length == 0)
            {
                clsCommon.MsgBox("Tên đăng nhập không được để trống, vui lòng nhập lại!", 5);
                xtabAccount.SelectedTabPage = xtpUserInfo;
                teUserName.Focus();
                return false;
            }

            if (tePass1.Text.Trim().Length == 0)
            {
                clsCommon.MsgBox("Mật khẩu không được để trống, vui lòng nhập lại!", 5);
                xtabAccount.SelectedTabPage = xtpUserInfo;
                tePass1.Focus();
                return false;
            }

            if (tePass2.Text.Length == 0)
            {
                clsCommon.MsgBox("Mật khẩu không được để trống, vui lòng nhập lại!", 5);
                xtabAccount.SelectedTabPage = xtpUserInfo;
                tePass2.Focus();
                return false;
            }

            if (tePass1.Text != tePass2.Text)
            {
                clsCommon.MsgBox("Mật khẩu không trùng nhau, vui lòng nhập lại!", 5);
                tePass1.Text = "";
                tePass2.Text = "";
                xtabAccount.SelectedTabPage = xtpUserInfo;
                tePass1.Focus();
                return false;
            }
            return true;
        }

        private void sbtnThem_Click(object sender, EventArgs e)
        {
            isThem = true;
            VisibleThemSuaXoaLuuHuy(false);
            enableControl(true);
            clearControl();
            teFullName.Focus();
        }

        private void sbtnSua_Click(object sender, EventArgs e)
        {
            isThem = false;

            teFullName.Enabled = true;
            tePass2.Enabled = true;
            tePass1.Enabled = true;
            teUserName.Enabled = false;

            VisibleThemSuaXoaLuuHuy(false);
        }

        private void sbtnLuu_Click(object sender, EventArgs e)
        {
            if (validateForm())
            {
                if (isThem)
                {
                    //Insert
                    if (cls.isExistUser(teUserName.Text))
                        clsCommon.MsgBox("Đã có tên đăng nhập này trong hệ thống, vui lòng chọn tên khác!", 5);
                    else
                    {
                        object result = cls.Insert(teFullName.Text, teUserName.Text, tePass1.Text, "0", "");
                        if (result != DBNull.Value)
                        {
                            clsCommon.MsgBox("Đã thêm " + teFullName.Text + " vào hệ thống! Bây giờ bạn có thể thiết lập phân quyền cho " + teFullName.Text + "!", 1);
                            clearwhencomplete();
                            sbtnXoa.Enabled = false;
                            gvDSUser.MoveLast();
                            xtabAccount.SelectedTabPage = xtpPhanQuyen;
                        }
                    }
                }
                else
                {
                    //Update
                    if (cls.UpdateUser(idUser, teFullName.Text, teUserName.Text, tePass1.Text, "1", "") == 1)
                    {
                        if (savePermission()) clsCommon.MsgBox("Các thay đổi đã được lưu!", 1);
                        else clsCommon.MsgBox("Thông tin phân quyền của người dùng chưa được lưu, vui lòng thiết lập lại phân quyền!", 5);
                    }
                    else clsCommon.MsgBox("Thay đổi chưa được lưu, vui lòng thử lại!", 5);

                    clearwhencomplete();
                    sbtnXoa.Enabled = false;
                }
            }
        }


        /// <summary>
        /// Lưu thiết lập phân quyền. Nếu lưu thành công trả về true, ngược lại trả về false.
        /// </summary>
        /// <returns></returns>
        private bool savePermission()
        {
            //Lưu thiết lập phân quyền
            DataRow dr; bool ok = true;
            
            for (int i = 0; i < gvPermission.DataRowCount; i++)
            {
                dr = gvPermission.GetDataRow(i);
                if (cls.UpdatePermission(idUser, (int)dr["FunctionID"], dr["Allow"] == DBNull.Value ? false : (bool)dr["Allow"]) == 0)
                {
                    int result = cls.InsertPermission(idUser, (int)dr["FunctionID"], dr["Allow"] == DBNull.Value ? false : (bool)dr["Allow"]);
                    if (result == 0) { ok = false; break; }
                }
            }

            return ok;
        }

        private void sbtnHuy_Click(object sender, EventArgs e)
        {
            clearwhencomplete();
            sbtnXoa.Enabled = false;
        }

        private void gvDSUser_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e)
        {
            idUser = Int32.Parse(gvDSUser.GetFocusedRowCellValue(gcolID).ToString());
            teFullName.Text = lblName.Text = gvDSUser.GetFocusedRowCellValue(gcolFullName).ToString();
            teUserName.Text = gvDSUser.GetFocusedRowCellValue(gcolUserName).ToString();
            tePass1.Text = tePass2.Text = clsCommon.Decrypt(gvDSUser.GetFocusedRowCellValue(gcolPass).ToString(), "KQXS", true);
            sbtnSua.Enabled = sbtnXoa.Enabled = teUserName.Text.Trim().ToUpper() != "ADMIN";
            gcPermission.DataSource = cls.loadPermission(idUser);
        }

        private void gvPermission_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e)
        {
            
        }

        private void sbtnXoa_Click(object sender, EventArgs e)
        {
            if (teUserName.Text.Trim() == "")
                clsCommon.MsgBox("Bạn phải chọn tài khoản trước khi xóa!", 5);
            else if (clsCommon.MsgBox("Bạn có chắc chắn xóa tài khoản " + teUserName.Text, 6) == DialogResult.Yes)
            {
                if (cls.Delete(idUser) > 0)
                {
                    clsCommon.MsgBox("Xóa thành công!", 1);
                    clearwhencomplete();
                }
            }
        }

        private void clearControl()
        {
            tePass2.Text = "";
            teFullName.Text = "";
            tePass1.Text = "";
            teUserName.Text = "";
        }

        /// <summary>
        /// ... đã có loaddata()
        /// </summary>
        private void clearwhencomplete()
        {
            VisibleThemSuaXoaLuuHuy(true);
            clearControl();
            enableControl(false);
            sbtnThem.Enabled = true;
            loaddata();
        }

        private void enableControl(bool ie)
        {
            teFullName.Enabled = ie;
            tePass2.Enabled = ie;
            tePass1.Enabled = ie;
            teUserName.Enabled = ie;
        }

        private void VisibleThemSuaXoaLuuHuy(bool visible)
        {
            sbtnThem.Visible = sbtnSua.Visible = sbtnXoa.Visible = visible;
            sbtnLuu.Visible = sbtnHuy.Visible = gvPermission.OptionsBehavior.Editable = !visible;
            gcDSUser.Enabled = visible;
        }
    }
}